package schedule

import (
	"context"
	"github.com/robfig/cron/v3"
	"github.com/sirupsen/logrus"
	"monoblog/common"
	"monoblog/config"
	"monoblog/domain/dao"
	"monoblog/domain/service"
)

// RegisterAndRunSchedules 初始化定时任务并启动
func RegisterAndRunSchedules() {
	//启动定时任务
	c := cron.New()
	var err error

	// 添加定时任务，每分钟执行一次
	_, err = c.AddFunc("@every 1m", func() {
		logrus.Infof("定时任务每分钟执行一次...")
	})

	// 添加定时任务，每2分钟执行一次
	_, err = c.AddFunc("@every 2m", UpdateRefreshBlog)

	if err != nil {
		panic(err)
	}
	c.Start() //启动定时任务
}

func UpdateRefreshBlog() {
	logrus.Infof("定时任务-更新Blog数据到SearchDB中 start...")
	ctx := context.Background()
	// 将文章id加入等待更新队列

	// 1. 从 Redis set 中取出最多 100 个 ID
	ids, _ := config.GetRedisClient().SPopN(ctx, common.REDIS_KEY_WAIT_FOR_UPDATE_BLOG, 100).Result() // 返回 []string，最多 100 个 ID
	if len(ids) == 0 {
		logrus.Infof("定时任务-更新Blog数据到SearchDB中 空任务 return...")
		return // 无待同步 ID，直接返回
	}

	points, err := dao.NewArticleRepository().FindBlogStatsByIds(ids)

	// 2. 调用服务层更新文章数据到 SearchDB
	err = service.GetSearchService().UpdateData(ctx, points)
	if err != nil {
		logrus.Errorf("定时任务-更新Blog数据到SearchDB中 批量推送数据失败 err: %v", err)
		return
	}

	logrus.Infof("定时任务-更新Blog数据到SearchDB中 完成 end...")
}
